# (err_code, pop_msg, desc)
from dataclasses import dataclass

@dataclass
class ErrorDef:
    error_code: str
    prompt_msg: str
    description: str


LINE_LENGTH_MAX = 120

HEADER_FILE_INCLUDE_FILTER = ("kernel_type.h",
                                "stdint.h",
                                "stddef.h",
                                "stdlib.h",
                                "stdbool.h",
                                "stdarg.h",
                                "string.h",
                                "stdio.h",
                                "math.h"
                                "time.h")

"""
101~119: lint error
"""
ErrorsDict = {
    "101": ErrorDef("101", """Unsupported twslint mark.""",                 """Twslik的标记中, 同一行中"+", "-", "!"三个符号不能混用不能混用"""),
    "102": ErrorDef("102", """Unsupported suppress type.""",                """Twslik的标记中, 只支持三种标记符号"+", "-", "!"."""),

    "120": ErrorDef("120", """Filename format invalid.""",                  """1. 名字全部使用英文小写字母a-z, 中间可以有下划线'_'. 2. 除了文件类型后缀'.c''.h', 文件名中不能有其他的'.'符号. 3. 不能使用'.'或'_开头', 只能使用英文字母开头."""),
    "121": ErrorDef("121", """Need new-line at the end of file""",          """1. 文件最后一行, 应为空行, 有且仅有一个空行. 2. 文件倒数第二行, 应有代码."""),
    "122": ErrorDef("122", """Need new-line at the end of file""",          """1. 文件最后一行, 应为空行, 有且仅有一个空行. 2. 文件倒数第二行, 应有代码."""),
    "123": ErrorDef("123", f"Line length over {LINE_LENGTH_MAX}" ,          """1. 行长度包含字符前后的空白字符, 2. 行长度不应超过规定的最大值"""),
    "124": ErrorDef("124", """Line ending with blank.""" ,                  """1. 行尾不应有多余的空白字符."""),
    "125": ErrorDef("125", """Line with illegal TAB.""" ,                   """1. 文件中不能包含'\\t', '\\f', '\\r'等字符. 2. 缩进应该用4个空格"""),
    "126": ErrorDef("126", """Found Chinese characters""" ,                 """1. 文件中不应有中文字符"""),
    "127": ErrorDef("127", """Invalid "#include" in header file.""" ,       f"1. 除了c库的标准头文件, 头文件中不应引用其他头文件, 2. 若引用了标准头文件也报错了, 请及时提出, 3. 当前可以引用的头文件有{HEADER_FILE_INCLUDE_FILTER}"),
    "128": ErrorDef("128", """Header file protect MARCO invalid""" ,        """1. 当文件名为aaa_bbb.h时, "#ifndef __XXX_XXX_H__"必须在第1行. 2. 使用与文件名同名的宏, 如头文件aaa_bbb.h, 应使用__AAA_BBB_H__来保护. 3. 前后需使用双下划线"__"."""),
    "129": ErrorDef("129", """Header file protect MARCO invalid""" ,        """1. 当文件名为aaa_bbb.h时, "#define __XXX_XXX_H__"必须在第2行. 2. 使用与文件名同名的宏, 如头文件aaa_bbb.h, 应使用__AAA_BBB_H__来保护. 3. 前后需使用双下划线"__"."""),
    "130": ErrorDef("130", """Header file protect MARCO invalid""" ,        """1. 当文件名为aaa_bbb.h时, "#endif // __XXX_XXX_H__"必须在倒数第2行. 2. 使用与文件名同名的宏, 如头文件aaa_bbb.h, 应使用__AAA_BBB_H__来保护. 3. 前后需使用双下划线"__"."""),
    "131": ErrorDef("131", """Illegal "extern" in source C file""" ,        """1. 在".c"文件中, 不能有extern开头的行."""),

    "200": ErrorDef("200", """Illegal single line comments""" ,             """1. 单行注释符"//"与后面的字符之间, 有且仅有1个空格, 不能没有空格, 也不能有多个空格"""),
    "201": ErrorDef("201", """Illegal single line comments""" ,             """1. 单行注释不应该在文件的最后一行"""),
    "202": ErrorDef("202", """Illegal single line comments""" ,             """1. 单行注释的下一行, 应该有代码, 不应为空行"""),
    "203": ErrorDef("203", """Illegal single line comments""" ,             """1. 单行注释的行缩进, 应与下一行保持一致"""),
    "204": ErrorDef("204", """Illegal single line comments""" ,             """1. 单行注释位于代码行之后时, 应与代码间有且仅有1个空格, 且注释符和注释之间有且仅有1个空格, 例如"code;    // comments"."""),

    "220": ErrorDef("220", """Illegal Multi-line comments""" ,              """1. 当注释为单行时，注释内容,与注释符号之间, 应有且仅有一个空格,例如"/* xxx */"."""),
    "221": ErrorDef("221", """Illegal Multi-line comments""" ,              """1. 注释不应在最后一行"""),
    "222": ErrorDef("222", """Illegal Multi-line comments""" ,              """1. 当下一行不为空, 且下一行有'}'符号时,  缩进应比下一行多4个空格"""),
    "223": ErrorDef("223", """Illegal Multi-line comments""" ,              """1. 当下一行不为空, 且下一行没有'}'符号时, 缩进应与下一行一致"""),
    "224": ErrorDef("224", """Illegal Multi-line comments""" ,              """1. 当下一行为空, 且上一行不为空时, 缩进应与上一行一致"""),
    "225": ErrorDef("225", """Illegal Multi-line comments""" ,              """1. 当下一行为空, 且上一行为空时, 此注释不应该存在, 应该删除"""),
    "226": ErrorDef("226", """Illegal Multi-line comments""" ,              """1. 注释内容与注释符之间, 有且只有一个空格: "/* comments */", 2. 注释应位于行末, 不应夹在代码之间: "code /* comments */ code;", 3. 注释内容与代码之间, 有且只有一个空格: "code; /* comments */". """),
    "227": ErrorDef("227", """Illegal Multi-line comments""" ,              """1. 起始行应使用新行, 前后不能有代码, 起始行使用符号"/**"."""),
    "228": ErrorDef("228", """Illegal Multi-line comments""" ,              """1. 起始行的缩进, 应比下一行少一个空格: " *" 比 "/**"多一个空格."""),
    "229": ErrorDef("229", """Illegal Multi-line comments""" ,              """1. 中间行使用符号" * comments" 或 " *", 注意'*'前的空格."""),
    "230": ErrorDef("230", """Illegal Multi-line comments""" ,              """1. 中间行缩进, 应和下一行一致."""),
    "231": ErrorDef("231", """Illegal Multi-line comments""" ,              """1. 结束行应使用新行, 前后不能有代码, 使用符号" */",  注意空格."""),
    "232": ErrorDef("232", """Illegal Multi-line comments""" ,              """1. 结束行, 当下一行不为空时, 缩进应比下一行多一个空格: " */"前面有一个空格."""),
    "233": ErrorDef("233", """Illegal Multi-line comments""" ,              """1. 结束行, 当下一行为空时, 缩进应为1个空格: " */"前面有一个空格."""),

    "251": ErrorDef("251", """Illegal memory operation function""" ,        """1. 不能使用不安全的内存操作函数, 例如memcpy等. 2. 应使用memcpy_s替代."""),
    "252": ErrorDef("252", """Hash IF usage error""" ,                      """1. 每行顶格书写: '#if' 前不能有空格. 2. 需要顶格书写的有: '#if', '#elif', '#else', '#endif'."""),
    "253": ErrorDef("253", """Hash DEFINE usage error""" ,                  """1. '#include'顶行写, 前面不能有空格. 2. '#include'后只有一个空格, 不能有多个空格. 3. 需要使用双引号, 不使用尖括号: 正确: '#include "xxx.h"',  错误: '#include <xxx.h>' 4. 不能带路径.错误: '#include "../aaa/bbb/xxx.h"'"""),

    "300": ErrorDef("300", """Struct indentation error""" ,                 """1. 每次缩进为4个空格. 2. 每多一个"{", 缩进增加4个空格, 3. 每多一个"}", 缩进减少4个空格"""),
    "301": ErrorDef("301", """Struct bracket format error""" ,              """1. 结构体定义时, 第一行花括号使用规则为"xxx {", 2. "xxx"与左花括号"{"之间, 有且仅有一个空格, 3. 当结构体为多行时, "{"应位于行尾, 后面不能有其他空格"""),
    "302": ErrorDef("302", """Struct bracket format error""" ,              """1. 结构体定义时, 结尾行花括号使用规则为"};" or "} XXX, YYY;", 2. "}"与"XXX"之间，有且仅有一个空格, 3. 逗号前面没有空格, 后面有且仅有一个空格, 4. 冒号前后没有空格."""),
    "303": ErrorDef("303", """Struct comma format error""" ,                """1. 逗号前面有且仅有一个空格 2. 逗号后面至少有一个空格"""),
    "304": ErrorDef("304", """Struct semicolon format error""" ,            """1. 分号前面不能有空格"""),
    "305": ErrorDef("305", """Struct bracket format error""" ,              """1. 圆括号和方括号, 与内部字符间不能有空格"""),
    "306": ErrorDef("306", """Struct name format error""" ,                 """1. 结构体命名时, 所有字符应该大写, 且应该以"_T"结尾, 例如"AAA_BBB_CCC_T"."""),
    "307": ErrorDef("307", """Struct name format error""" ,                 """1. 结构体命名时, 所有字符应该大写, 且应该以"_T"结尾, 例如"AAA_BBB_CCC_T"."""),

    "400": ErrorDef("400", """Enum comma format error""" ,                  """1. Enum定义的枚举名, 逗号后有且仅有1个空格, 例如: "enum XXX_E, YYY_E {"."""),
    "401": ErrorDef("401", """Enum indentation format error""" ,            """1. 每次缩进为4个空格. 2. 每多一个"{", 缩进增加4个空格, 3. 每多一个"}", 缩进减少4个空格."""),
    "402": ErrorDef("402", """Enum define format error""" ,                 """1. enum定义的语法为"[typedef] enum [ENUM NAME] {". 2. 花括号"{"之前, 有且仅有1个空格, 3. 花括号"{"之后应该换行, 不应有其他字符."""),
    "403": ErrorDef("403", """Enum bracket format error""" ,                """1. Enum格式应为"};" or "} XXX, YYY;". 2. 右花括号"}"应位于新行, 3. 当右花括号"}"不是分号";"时, 右花括号"}"与字符间有且仅有1个空格"""),
    "404": ErrorDef("404", """Enum comma format error""" ,                  """1. 枚举类型内部成员定义时, 逗号","与成员名之间, 不应有空格."""),
    "405": ErrorDef("405", """Enum member name format error""" ,            """1. 枚举成员名定义时, 应全部大写 ("0x"十六进制除外)."""),
    "406": ErrorDef("406", """Enum operator format error""" ,               """1. 运算符"+","-","="规则, 2. 运算符前面与字符间, 有1个或1个以上的空格, 3. 运算符后面与字符间, 有且仅有1个空格."""),
    "407": ErrorDef("407", """Enum comma format error""" ,                  """1. Enum定义的枚举名, 逗号后有且仅有1个空格, 例如: "} XXX_E, YYY_E"."""),
    "408": ErrorDef("408", """Enum name format error""" ,                   """1. 枚举命名时, 所有字符应该大写, 且应该以"_E"结尾, 例如"AAA_BBB_CCC_E"."""),
    "409": ErrorDef("409", """Enum name format error""" ,                   """1. 枚举命名时, 所有字符应该大写, 且应该以"_E"结尾, 例如"AAA_BBB_CCC_E"."""),

    "500": ErrorDef("500", """Union space format error""" ,                 """1. 任意两个字符串之间, 有且仅有1个空格."""),
    "501": ErrorDef("501", """Union comma format error""" ,                 """1. 逗号","之前不能有空格, 2. 逗号","之后有且仅有一个空格."""),
    "502": ErrorDef("502", """Union semicolon format error""" ,             """1. 分号";"之前不能有空格."""),
    "503": ErrorDef("503", """Union brackets format error""" ,              """1. 括号规则"(" "[" "{", 2. 左括号"(" "[" "{"后面没有空格. 3. 右括号")" "]" "}"前面没有空格"""),

    "600": ErrorDef("600", """Function bracket format error""" ,            """1. 函数的左花括号"{"应位于函数定义的下一行, 且前后不能有其他字符."""),
    "601": ErrorDef("601", """Function bracket format error""" ,            """1. 函数的右花括号"}"应位于函数的最后一行新行, 且前后不能有其他字符."""),
    "602": ErrorDef("602", """Function bracket format error""" ,            """1. 函数内部括号规则"(" "[". 2. 左括号"(" "["之后, 与字符间不能有空格. 3. 右括号")" "]"之前, 与字符间不能有空格"""),
    "603": ErrorDef("603", """Function "if else" format error""" ,          """1. "else if"的格式为"} else if (xxx) {". 2. 整个结构为一个新行. 3. "else if"前后有且仅有1个空格. 4. ")"与"{"间, 有且仅有1个空格. 5. "if"与"("间, 有且仅有1个空格. 6. "}"与"else"间, 有且仅有1个空格. 7. 左圆括号"("后面没有空格. 8. 右圆括号")"前面没有空格."""),
    "604": ErrorDef("604", """Function "if else" format error""" ,          """1. "if"的格式为"if (xxx) {". 2. 整个结构为一个新行. 3. ")"与"{"间, 有且仅有1个空格. 4. "if"与"("间, 有且仅有1个空格. 5. 左圆括号"("后面没有空格. 6. 右圆括号")"前面没有空格."""),
    "605": ErrorDef("605", """Function "if else" format error""" ,          """1. "else"的格式为"} else {". 2. 整个结构为一个新行. 3. "else"与左右花括号间, 有且仅有1个空格."""),
    "606": ErrorDef("606", """Function "for" format error""" ,              """1. "for"语句的格式为"for (xxx) {". 2. 整个结构为一个新行. 3. "for"与"("之间, 有且仅有1个空格. 4. ")"与"{"之间, 有且仅有1个空格. 5. 左圆括号"("后面没有空格. 6. 右圆括号")"前面没有空格."""),
    "607": ErrorDef("607", """Function "switch" format error""" ,           """1. "switch"语句的格式为"switch (xxx) {". 2. 整个结构为一个新行. 3. "switch"与"xxx"之间, 有且仅有1个空格. 4. "xxx"与":"之间, 没有空格."""),
    "608": ErrorDef("608", """Function "switch case" format error""" ,      """1. "switch case"语句的格式为"case xxx:". 2. 整个结构为一个新行. 3. "case"与"xxx"之间, 有且仅有1个空格. 4. "xxx"与":"之间, 没有空格."""),
    "609": ErrorDef("609", """Function "switch break" format error""" ,     """1. "switch break"语句的格式为"break;". 2. 整个结构为一个新行. 3. "break"与";"之间, 没有空格."""),
    "610": ErrorDef("610", """Function "switch default" format error""" ,   """1. "switch default"语句的格式为"default:". 2. 整个结构为一个新行. 3. "default"与":"之间, 没有空格."""),
    "611": ErrorDef("611", """Function comma format error""" ,              """1. ","和";"规则. 2. 当","和";"位于行中间时, 格式应该为."A, B" or "A; B". 3. ","和";"前面没有空格. 4. ","和";"后面有且仅有1个空格."""),
    "612": ErrorDef("612", """Function comma format error""" ,              """1. ","和";"规则. 2. 当","和";"位于行末时, 格式应该为."A," or "A;". 3. ","和";"前面没有空格."""),
    "613": ErrorDef("613", """Function "do while" format error""" ,         """1. "do"语句的格式为"do {". 2. 整个结构为一个新行. 3. "do"和"{"之间, 有且仅有1个空格."""),
    "614": ErrorDef("614", """Function "do while" format error""" ,         """1. "while"语句的格式为"} while (xxx);". 2. 整个结构为一个新行. 3. "}"和"while"之间, 有且仅有1个空格. 4. "while"和"("之间, 有且仅有1个空格. 5. ")"和";"之间没有空格. 6. 左圆括号"("后面没有空格. 7. 右圆括号")"前面没有空格."""),
    "615": ErrorDef("615", """Function "do while" format error""" ,         """1. "while"语句的格式为"while (xxx) {". 2. 整个结构为一个新行. 3. "while"和"("之间, 有且仅有1个空格. 4. ")"和"{"之间, 有且仅有1个空格.  5. 左圆括号"("后面没有空格. 6. 右圆括号")"前面没有空格."""),


}

